package jsu.ljy.lostandfind.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.UUID;

/**
 * 文件上传工具类
 * 
 * <p>提供文件上传的工具方法，使用阿里云 OSS 存储文件。
 * 支持图片文件的上传和处理，包含文件类型验证和大小限制。</p>
 * 
 * @author 罗嘉毅
 * @version 1.0
 * @since 2024-03-21
 */
@Component
public class FileUploadUtil {
    // 允许上传的文件类型
    private static final String[] ALLOWED_EXTENSIONS = {".jpg", ".jpeg", ".png", ".gif"};
    // 最大文件大小（5MB）
    private static final long MAX_FILE_SIZE = 5 * 1024 * 1024;
    
    // 阿里云 OSS 配置
    @Value("${aliyun.oss.endpoint}")
    private String endpoint;

    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;

    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

    /**
     * 处理文件上传到阿里云 OSS
     * 
     * @param file 上传的文件
     * @return 保存后的文件访问路径
     * @throws IllegalArgumentException 当文件格式或大小不符合要求时抛出
     * @throws IOException 当文件保存失败时抛出
     */
    public String handleFileUpload(MultipartFile file) throws IOException {
        // 检查文件大小
        if (file.getSize() > MAX_FILE_SIZE) {
            throw new IllegalArgumentException("文件大小不能超过5MB");
        }

        String fileName = file.getOriginalFilename();
        if (!isValidFileExtension(fileName)) {
            throw new IllegalArgumentException("不支持的文件类型");
        }

        // 生成新的文件名
        String extension = FilenameUtils.getExtension(fileName);
        String newFilename = UUID.randomUUID().toString() + "." + extension;

        // 创建 OSSClient 实例
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建上传请求
            PutObjectRequest putObjectRequest = new PutObjectRequest(
                bucketName, 
                "uploads/" + newFilename, 
                file.getInputStream()
            );

            // 上传文件
            ossClient.putObject(putObjectRequest);

            // 返回文件访问URL
            return "https://" + bucketName + ".oss-cn-hangzhou.aliyuncs.com/uploads/" + newFilename;
        } finally {
            ossClient.shutdown();
        }
    }

    /**
     * 删除云端文件
     * 
     * @param fileUrl 文件访问路径
     */
    public void deleteFile(String fileUrl) {
        if (fileUrl != null && !fileUrl.isEmpty()) {
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            try {
                String objectName = fileUrl.substring(fileUrl.indexOf("/uploads/"));
                ossClient.deleteObject(bucketName, objectName);
            } finally {
                ossClient.shutdown();
            }
        }
    }

    /**
     * 验证文件格式
     * 
     * @param fileName 文件名
     * @return 是否为允许的文件格式
     */
    private static boolean isValidFileExtension(String fileName) {
        if (fileName == null || fileName.isEmpty()) {
            return false;
        }
        String extension = "." + FilenameUtils.getExtension(fileName).toLowerCase();
        for (String allowedExt : ALLOWED_EXTENSIONS) {
            if (allowedExt.equalsIgnoreCase(extension)) {
                return true;
            }
        }
        return false;
    }
} 